home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / ab20_archive / utilities / emulators / apple2emul.lzh / mem.c < prev    next >
C/C++ Source or Header  |  1991-04-18  |  3KB  |  189 lines

  1. /*
  2.  *  a2, an Apple II emulator in C
  3.  *  (c) Copyright 1990 by Rich Skrenta
  4.  *
  5.  *  Command line interface written by Tom Markson
  6.  *
  7.  *  Distribution agreement:
  8.  *
  9.  *    You may freely copy or redistribute this software, so long
  10.  *    as there is no profit made from its use, sale, trade or
  11.  *    reproduction.  You may not change this copyright notice,
  12.  *    and it must be included prominently in any copy made.
  13.  *
  14.  *  Send emulator related mail to:  skrenta@blekko.commodore.com
  15.  *                    skrenta@blekko.uucp
  16.  */
  17.  
  18.  
  19. #include    <stdio.h>
  20. #include    "a2.h"
  21.  
  22.  
  23. unsigned char mem[65536];        /* 64K memory image */
  24. unsigned char jmp_tbl[65536];        /* jmp & jsr interceptor functions */
  25. int (*mem_set[256])();            /* memory store interceptors */
  26.  
  27. unsigned char rom[0x3000];
  28. unsigned char ram[0x2000];
  29. unsigned char bank1[0x1000];
  30. unsigned char bank2[0x1000];
  31.  
  32.  
  33. int ram_read = 0;
  34. int ram_write = 0;
  35. int bank2_enable = 0;
  36.  
  37.  
  38. memory_setup() {
  39. long i;
  40. int set_writep();
  41.  
  42.     for (i = 0; i < 256; i++)
  43.         mem_set[i] = NULL;
  44.  
  45.     for (i = 0; i < 65536; i++)
  46.         jmp_tbl[i] = 0;
  47.  
  48.     writep(set_writep);
  49.     ram_copy(&mem[0xD000], rom, 0x3000);
  50. }
  51.  
  52.  
  53. ram_copy(from, to, len)
  54. unsigned char *from;
  55. unsigned char *to;
  56. int len;
  57. {
  58.  
  59.     while (len--)
  60.         *to++ = *from++;
  61. }
  62.  
  63.  
  64. /*
  65.  *  Write protect/unprotect D000-FFFF
  66.  */
  67. writep(fn)
  68. int (*fn)();
  69. {
  70. int i;
  71.  
  72.     for (i = 0xD0; i <= 0xFF; i++)
  73.         mem_set[i] = fn;
  74. }
  75.  
  76.  
  77. set_writep(a, n)
  78. unsigned short a;
  79. unsigned char n;
  80. {
  81.     /* Just eat it. */
  82. }
  83.  
  84.  
  85. set_ramwrite(a, n)
  86. unsigned short a;
  87. unsigned char n;
  88. {
  89.  
  90.     if (a >= 0xE000)
  91.         ram[a - 0xE000] = n;
  92.     else if (bank2_enable)
  93.         bank2[a - 0xD000] = n;
  94.     else
  95.         bank1[a - 0xD000] = n;
  96. }
  97.  
  98.  
  99.  
  100.  
  101. ram_card(addr)
  102. unsigned short addr;
  103. {
  104.  
  105.     if (ram_read) {
  106.         ram_copy(&mem[0xE000], ram, 0x2000);
  107.         if (bank2_enable)
  108.             ram_copy(&mem[0xD000], bank2, 0x1000);
  109.         else
  110.             ram_copy(&mem[0xD000], bank1, 0x1000);
  111.     }
  112.  
  113.     switch (addr & 0x000F) {
  114.     case 0x00:             /* C080 */
  115.         ram_read  = 1;
  116.         ram_write = 0;
  117.         bank2_enable = 1;
  118.  
  119.         ram_copy(ram, &mem[0xE000], 0x2000);
  120.         ram_copy(bank2, &mem[0xD000], 0x1000);
  121.         writep(set_writep);
  122.         break;
  123.  
  124.     case 0x01:            /* C081 */
  125.         ram_read  = 0;
  126.         ram_write = 1;
  127.         bank2_enable = 1;
  128.  
  129.         ram_copy(rom, &mem[0xD000], 0x3000);
  130.         writep(set_ramwrite);
  131.         break;
  132.  
  133.     case 0x02:            /* C082 */
  134.         ram_read  = 0;
  135.         ram_write = 0;
  136.         bank2_enable = 1;
  137.  
  138.         ram_copy(rom, &mem[0xD000], 0x3000);
  139.         writep(set_writep);
  140.         break;
  141.  
  142.     case 0x03:            /* C083 */
  143.         ram_read  = 1;
  144.         ram_write = 1;
  145.         bank2_enable = 1;
  146.  
  147.         ram_copy(ram, &mem[0xE000], 0x2000);
  148.         ram_copy(bank2, &mem[0xD000], 0x1000);
  149.         writep(NULL);
  150.         break;
  151.  
  152.     case 0x08:             /* C088 */
  153.         ram_read  = 1;
  154.         ram_write = 0;
  155.         bank2_enable = 0;
  156.  
  157.         ram_copy(ram, &mem[0xE000], 0x2000);
  158.         ram_copy(bank1, &mem[0xD000], 0x1000);
  159.         writep(set_writep);
  160.         break;
  161.  
  162.     case 0x09:            /* C089 */
  163.         ram_read  = 0;
  164.         ram_write = 1;
  165.         bank2_enable = 0;
  166.         ram_copy(rom, &mem[0xD000], 0x3000);
  167.         writep(set_ramwrite);
  168.         break;
  169.  
  170.     case 0x0a:            /* C08A */
  171.         ram_read  = 0;
  172.         ram_write = 0;
  173.         bank2_enable = 0;
  174.         ram_copy(rom, &mem[0xD000], 0x3000);
  175.         writep(set_writep);
  176.         break;
  177.  
  178.     case 0x0b:            /* C08B */
  179.         ram_read  = 1;
  180.         ram_write = 1;
  181.         bank2_enable = 0;
  182.         ram_copy(ram, &mem[0xE000], 0x2000);
  183.         ram_copy(bank1, &mem[0xD000], 0x1000);
  184.         writep(NULL);
  185.         break;
  186.     }
  187. }
  188.  
  189.